//
//  WBNetworkManager.swift
//  Weibo
//
//  Created by cc on 9/15/17.
//  Copyright © 2017 cc. All rights reserved.
//

import UIKit
import AFNetworking


/// Swift 的枚举支持任意数据类型
enum WBHTTPMethod {
    case GET
    case POST
}




/// 网络管理工具
class WBNetworkManager: AFHTTPSessionManager {
    
    /// 静态区 / 常量 / 闭包
    // 在第一次访问时，执行闭包， 并且将结果保存在shared 常量中
    static let shared = WBNetworkManager()
    
    
    /// 访问令牌，所有请求都基于此令牌(登录除外)
    /// 为了保护用户安全，访问令牌有时限，默认是三天
    var accessToken: String?  //= "2.00NKbMECwXsXJB81a1831dffN9yRFC"
    
    
    /// 用户的微博id
    var uid: String? = "1894373805"
    
    
    /// 用户登录标记[计算型属性]
    var userLogon: Bool {
        return accessToken != nil
    }
    
    
    /// 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: WBHTTPMethod = .GET ,URLString: String, parameters: [String: Any]?, completion:@escaping (Any?, Bool)->()) {
        
        
        //处理token字典
        // 0 判断token 是否为nil， 为nil 直接返回
        guard let token  = accessToken else {
            //FIXME : 发送通知，提示用户登录
            print("没有token， 需要登录")
            completion(nil, false)
            return
        }
        
        
        // 1> 判断 参数字典是否存在， 如果为nil ，新建一个字典
        var parameters = parameters
    
        if parameters == nil {
            //实例化字典
            parameters = [String: Any]()
        }
        
        
        // 2> 设置参数字典,  代码在此处一定有值
        parameters!["access_token"] = token
        
        
        //调用 request 发起真正的网络请求
        request(URLString: URLString, parameters: parameters, completion: completion)
    }
    
    
    
    /// 封装 AFN 的GET / POST 请求
    ///
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: URLString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调 [json( 字典 / 数组) ， 是否成功]
    func request(method: WBHTTPMethod = .GET ,URLString: String, parameters: [String: Any]?, completion:@escaping (Any?, Bool)->()) {
        
        //成功回调
        let success = { (task: URLSessionDataTask, json: Any?)->() in
           completion(json, true)
        }
        //失败回调
        
        let failure = { (task: URLSessionDataTask?, error: Error)->() in
            
            //针对 403 处理用户 token 过期
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("Token 过期了")
                
                // FIXME: 发送通知，提示用户登录(本方法不知道被谁调用，谁接收到通知，谁处理！)
            }
            
            print("网络请求错误 \(error)")
            
            completion(nil, false)
        }
        
        
        if method == .GET {
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        } else {
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
        
        
        
    }
    
}
